library(data.table)
library(tidyr)
library(maps)
library(haven)
library(ggplot2)
library(dplyr)
library(readxl)
library(ggrepel)
library(wordcloud)

PREPARATION DATASETS FOR ANALYSIS #################### #################### ####################

PREP THE DATASET FOR ANALYSIS WVS 5 & 6 ####################

#read the data (Wave 5)

# Data of Wave 5
WV5_data <- readRDS("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/F00007944-WV5_Data_R_v20180912.rds")

# Convert WV5_data-object in data.frame 
WV5_data_df <- as.data.frame(WV5_data)

# show first five columns
WV5_data_df

clean the data set

#rename the variables
WV5_data <- WV5_data_df %>%
  rename(gender = V235, age = V237, country_code = V2, wave = V1, risktaking = V86, children = V56, married = V55, employed = V241, education = V238)
WV5_data

colnames(WV5_data)
  [1] "wave"          "V1A"           "V1B"           "country_code"  "V2A"           "V3"            "V4"           
  [8] "V4_CO"         "V5"            "V5_CO"         "V6"            "V6_CO"         "V7"            "V7_CO"        
 [15] "V8"            "V8_CO"         "V9"            "V9_CO"         "V10"           "V11"           "V12"          
 [22] "V13"           "V14"           "V15"           "V16"           "V17"           "V18"           "V19"          
 [29] "V20"           "V21"           "V22"           "V23"           "V24"           "V25"           "V26"          
 [36] "V27"           "V28"           "V29"           "V30"           "V31"           "V32"           "V33"          
 [43] "V34"           "V35"           "V36"           "V37"           "V38"           "V39"           "V40"          
 [50] "V41"           "V42"           "V43"           "V43_01"        "V43_02"        "V43_03"        "V43_04"       
 [57] "V43_05"        "V43_06"        "V43_07"        "V43_08"        "V43_09"        "V43_10"        "V43_11"       
 [64] "V43_12"        "V43_13"        "V43_14"        "V43_15"        "V43_16"        "V43_17"        "V43_18"       
 [71] "V43_19"        "V43_20"        "V43_21"        "V43_22"        "V43_23"        "V43_24"        "V43_25"       
 [78] "V43_26"        "V43_27"        "V43_28"        "V43_29"        "V43_30"        "V44"           "V45"          
 [85] "V46"           "V47"           "V48"           "V49"           "V50"           "V51"           "V52"          
 [92] "V53"           "V54"           "married"       "children"      "V57"           "V58"           "V59"          
 [99] "V60"           "V61"           "V62"           "V63"           "V64"           "V65"           "V66"          
[106] "V67"           "V68"           "V69"           "V69_HK"        "V70"           "V70_HK"        "V71"          
[113] "V72"           "V73"           "V73_HK"        "V74"           "V74_HK"        "V75"           "V76"          
[120] "V77"           "V78"           "V79"           "V80"           "V81"           "V82"           "V83"          
[127] "V84"           "V85"           "risktaking"    "V87"           "V88"           "V89"           "V90"          
[134] "V91"           "V92"           "V93"           "V94"           "V95"           "V96"           "V97"          
[141] "V98"           "V99"           "V100"          "V101"          "V102"          "V103"          "V104"         
[148] "V105"          "V106"          "V107"          "V108"          "V109"          "V110"          "V111"         
[155] "V112"          "V113"          "V114"          "V115"          "V116"          "V117"          "V118"         
[162] "V119"          "V120"          "V121"          "V122"          "V123"          "V124"          "V125"         
[169] "V126"          "V127"          "V128"          "V129"          "V130"          "V130_CA_1"     "V130_IQ_1"    
[176] "V130_IQ_2"     "V130_IQ_3"     "V130_IQ_4"     "V130_NZ_1"     "V130_NZ_2"     "V131"          "V132"         
[183] "V133"          "V134"          "V135"          "V136"          "V137"          "V138"          "V139"         
[190] "V140"          "V141"          "V142"          "V143"          "V144"          "V145"          "V146_00"      
[197] "V146_01"       "V146_02"       "V146_03"       "V146_04"       "V146_05"       "V146_06"       "V146_07"      
[204] "V146_08"       "V146_09"       "V146_10"       "V146_11"       "V146_12"       "V146_13"       "V146_14"      
[211] "V146_15"       "V146_16"       "V146_17"       "V146_18"       "V146_19"       "V146_20"       "V146_21"      
[218] "V146_22"       "V147"          "V148"          "V149"          "V150"          "V151"          "V151_IQ_A"    
[225] "V151_IQ_B"     "V152"          "V153"          "V154"          "V155"          "V156"          "V157"         
[232] "V158"          "V159"          "V160"          "V161"          "V162"          "V163"          "V164"         
[239] "V165"          "V166"          "V167"          "V168"          "V169"          "V170"          "V171"         
[246] "V172"          "V173"          "V174"          "V175"          "V176"          "V177"          "V178"         
[253] "V179"          "V180"          "V181"          "V182"          "V183"          "V184"          "V185"         
[260] "V186"          "V187"          "V188"          "V189"          "V190"          "V191"          "V192"         
[267] "V193"          "V194"          "V195"          "V196"          "V197"          "V198"          "V199"         
[274] "V200"          "V201"          "V202"          "V203"          "V204"          "V205"          "V206"         
[281] "V207"          "V208"          "V209"          "V210"          "V211"          "V212"          "V213A"        
[288] "V213B"         "V213C"         "V213D"         "V213E"         "V213F"         "V213G"         "V213H"        
[295] "V213K"         "V213L"         "V213M"         "V213N"         "V214"          "V215"          "V216"         
[302] "V217"          "V218"          "V219"          "V220"          "V221"          "V222"          "V223"         
[309] "V224"          "V225"          "V226"          "V227"          "V228"          "V229"          "V230"         
[316] "V231"          "V232"          "V233"          "V233A"         "V234"          "gender"        "V236"         
[323] "age"           "education"     "V238CS"        "V239"          "V240"          "employed"      "V242"         
[330] "V242A_CO"      "V243"          "V244"          "V245"          "V246"          "V247"          "V248"         
[337] "V249"          "V250"          "V251"          "V252"          "V252B"         "V253"          "V253CS"       
[344] "V254"          "V255"          "V255CS"        "V256"          "V257"          "V257B"         "V257C"        
[351] "V258"          "V259"          "V259A"         "V260"          "V261"          "V262"          "V263"         
[358] "V264"          "V265"          "S024"          "S025"          "Y001"          "Y002"          "Y003"         
[365] "SACSECVAL"     "SECVALWGT"     "RESEMAVAL"     "WEIGHTB"       "I_AUTHORITY"   "I_NATIONALISM" "I_DEVOUT"     
[372] "DEFIANCE"      "WEIGHT1A"      "I_RELIGIMP"    "I_RELIGBEL"    "I_RELIGPRAC"   "DISBELIEF"     "WEIGHT2A"     
[379] "I_NORM1"       "I_NORM2"       "I_NORM3"       "RELATIVISM"    "WEIGHT3A"      "I_TRUSTARMY"   "I_TRUSTPOLICE"
[386] "I_TRUSTCOURTS" "SCEPTICISM"    "WEIGHT4A"      "I_INDEP"       "I_IMAGIN"      "I_NONOBED"     "AUTONOMY"     
[393] "WEIGHT1B"      "I_WOMJOB"      "I_WOMPOL"      "I_WOMEDU"      "EQUALITY"      "WEIGHT2B"      "I_HOMOLIB"    
[400] "I_ABORTLIB"    "I_DIVORLIB"    "CHOICE"        "WEIGHT3B"      "I_VOICE1"      "I_VOICE2"      "I_VOI2_00"    
[407] "VOICE"         "WEIGHT4B"      "S001"          "S007"          "S018"          "S019"          "S021"         
[414] "COW"          
#select only the variables of interest
WV5_data <- WV5_data %>%
  dplyr::select(gender, age, country_code, wave, risktaking, children, employed, education, married)
WV5_data

Read countrynames data from the CSV file (to decode the dataset 5)

countrynames <- read.csv("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/countrynames.txt", header = FALSE, as.is = TRUE)
colnames(countrynames) <- c("code", "name")

# Assuming WV5_data has a column named country_code
WV5_data$country <- countrynames$name[match(WV5_data$country_code, countrynames$code)]

# Check the frequency of each country in the new column
table(WV5_data$country)

            Andorra           Argentina           Australia              Brazil            Bulgaria        Burkina Faso 
               1003                1002                1421                1500                1001                1534 
             Canada               Chile               China            Colombia          Cyprus (G)               Egypt 
               2164                1000                1991                3025                1050                3051 
           Ethiopia             Finland              France             Georgia             Germany               Ghana 
               1500                1014                1001                1500                2064                1534 
      Great Britain           Guatemala           Hong Kong             Hungary               India           Indonesia 
               1041                1000                1252                1007                2001                2015 
               Iran                Iraq               Italy               Japan              Jordan            Malaysia 
               2667                2701                1012                1096                1200                1201 
               Mali              Mexico             Moldova             Morocco         Netherlands         New Zealand 
               1534                1560                1046                1200                1050                 954 
             Norway                Peru              Poland             Romania              Russia              Rwanda 
               1025                1500                1000                1776                2033                1507 
           Slovenia        South Africa         South Korea               Spain              Sweden         Switzerland 
               1037                2988                1200                1200                1003                1241 
             Taiwan            Thailand Trinidad and Tobago              Turkey             Ukraine       United States 
               1227                1534                1002                1346                1000                1249 
            Uruguay            Viet Nam              Zambia 
               1000                1495                1500 
# Display the updated WV5_data
print(WV5_data)

#Read Dataset (Wave 6)

WV6_data <- load("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/WV6_Data_R_v20201117.rdata") 
WV6_data <- WV6_Data_R_v20201117 
print(WV6_data)

#rename variables

WV6_data <- WV6_data %>%
  rename(wave = V1, gender = V240, age = V242,country_code = V2, risktaking = V76, children = V58, married = V57, employed = V229, education = V248)

#select only the variables of interest
WV6_data <- WV6_data %>%
  dplyr::select(gender, age, country_code, wave, risktaking, children, employed, education, married)
WV6_data

#decode daraset (Wave 6)

countrynames = read.csv("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV6_data$country = countrynames$name [match(WV6_data$country_code, countrynames$code)]
table(WV6_data$country)

            Algeria           Argentina             Armenia           Australia          Azerbaijan             Belarus 
               1200                1030                1100                1477                1002                1535 
             Brazil               Chile               China            Colombia          Cyprus (G)             Ecuador 
               1486                1000                2300                1512                1000                1202 
              Egypt             Estonia             Georgia             Germany               Ghana               Haiti 
               1523                1533                1202                2046                1552                1996 
          Hong Kong               India                Iraq               Japan              Jordan          Kazakhstan 
               1000                4078                1200                2443                1200                1500 
             Kuwait          Kyrgyzstan             Lebanon               Libya            Malaysia              Mexico 
               1303                1500                1200                2131                1300                2000 
            Morocco         Netherlands         New Zealand             Nigeria            Pakistan           Palestine 
               1200                1902                 841                1759                1200                1000 
               Peru         Philippines              Poland               Qatar             Romania              Russia 
               1210                1200                 966                1060                1503                2500 
             Rwanda           Singapore            Slovenia        South Africa         South Korea               Spain 
               1527                1972                1069                3531                1200                1189 
             Sweden              Taiwan            Thailand Trinidad and Tobago             Tunisia              Turkey 
               1206                1238                1200                 999                1205                1605 
            Ukraine       United States             Uruguay          Uzbekistan               Yemen            Zimbabwe 
               1500                2232                1000                1500                1000                1500 
WV6_data

#combine the 2 dataset (Wave 6 + Wave 5)

WV5_data
WV6_data
WVS_data = rbind(WV5_data, WV6_data)
WVS_data

#exclusion of participants and omission of missing data (na)

WVS_data = subset(WVS_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
data_Wave5 = subset(WV5_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
data_Wave6 = subset(WV6_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
WVS_data <- na.omit(WVS_data)
data_Wave5 <- na.omit(data_Wave5)
data_Wave6 <- na.omit(data_Wave6)

# Use the mutate function to change the country name
WVS_data <- WVS_data %>%
  mutate(country = ifelse(country == "Great Britain", "United Kingdom", country))

#Transformation of item risktaking

# Transfrom risk item such that high values represent more risk taking
WVS_data$risktaking = 6 - WVS_data$risktaking + 1

# Transform risk variable into T-score (mean = 50, sd = 10)
WVS_data$T_score_risktaking = 10*scale(WVS_data$risktaking, center=TRUE,scale=TRUE)+50

WVS_data

#Transform risk variable into Z score 
# Assuming T-scores have a mean of 50 and a standard deviation of 10
WVS_data$Z_score_risktaking = (WVS_data$T_score_risktaking - 50) / 10

# Print the resulting data frame
print(WVS_data)

WVS_data <- WVS_data %>%
  group_by(country) %>%
  mutate(z_score_age = scale(age))
WVS_data

Dichotomizing Variables: This helps estimating and interpreting the models later on…

WVS_data$gender = ifelse(WVS_data$gender == 1, 0, 1) # sex: male vs. female
WVS_data$children = ifelse(WVS_data$children == 0, 0, 1) # children: no vs. yes
WVS_data$married = ifelse(WVS_data$married == 1, 1, 0) # married: yes vs. no
WVS_data$employed = ifelse(WVS_data$employed < 4, 1, 0) # employed: yes vs. no
WVS_data$education = ifelse(WVS_data$education < 4, 0, 1) # education: no primary vs. primary+ 

PREP THE DATASET FOR ANALYSIS GPS ####################

#Add data GPS

gps_data <- haven::read_dta("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/GPS_dataset_individual_level/individual_new.dta")

head(gps_data)

Clean the data by removing records with missing values

gps_data <- gps_data %>%
  drop_na(country, isocode, risktaking, gender, age)

# Display the cleaned data
gps_data

#select only the variables of interest

gps_data <- gps_data %>%
  dplyr::select(country, isocode, ison, risktaking, gender, age)
gps_data

Transform age (z-score)

gps_data <- gps_data %>%
  group_by(country) %>%
  mutate(z_score_age = scale(age))

# Display the new column with Z-Scores per Country
gps_data

PREP THE DATASET FOR ANALYSIS HARDSHIP ####################

read in file that contains hardship indicators manually collected from CIA factbook, WHO, and World Bank

excel_path <- "/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/Hardship/Hardship_complete_2024.xlsx"
hardship <- read_excel(excel_path)

# Create a vector of labels with the same length as the number of columns in 'countryfacts'
labels <- c("country","mean_homicide","gdp","gini_income","Infant_mortality","life_expect","primary_female_enrollment_rate")

# Print the result
print(hardship)

Create the ‘hardship’ column in the ‘hardship’ data frame

# Create the 'hardship' column in the 'hardship' data frame
hardship <- hardship %>%
  mutate(hardship = (mean_homicide + gdp + gini_income + Infant_mortality + life_expect + primary_female_enrollment_rate) / 6)
hardship

log transform

hardship$mean_homicide=log(hardship$mean_homicide)
hardship$gdp=log(hardship$gdp)
hardship$Infant_mortality=log(hardship$Infant_mortality)
hardship$life_expect=log(hardship$life_expect)
hardship$gini_income=log(hardship$gini_income)
hardship$primary_female_enrollment_rate=log(hardship$primary_female_enrollment_rate)

# changing variables into the same direction

# Reverse Codierung
hardship$mean_homicide=scale(hardship$mean_homicide)
hardship$gdp=scale(-hardship$gdp)
hardship$Infant_mortality=scale(hardship$Infant_mortality)
hardship$life_expect=scale(-hardship$life_expect)
hardship$gini_income=scale(hardship$gini_income)
hardship$primary_female_enrollment_rate=scale(hardship$primary_female_enrollment_rate)

hardship

create a hardship index

hardship$hardship=(hardship$mean_homicide+hardship$gdp+hardship$gini_income+hardship$life_expect+hardship$Infant_mortality+hardship$primary_female_enrollment_rate)/6

hardship

PREP THE DATASET FOR ANALYSIS MIXED-MODELS ####################

#Add Hardship to WVS_data

WVS_mixed_model <- left_join(WVS_data, hardship, by = "country")
WVS_mixed_model

#Add Hardship to gps_data

gps_mixed_model <- left_join(gps_data, hardship, by = "country")
gps_mixed_model

DESCRIPTIVE INFORMATION #################### #################### ####################

#table with female percentage, mean age, mean risk taking per countries (summary of the countries)

table_data_WVS <- WVS_data %>%
  group_by(country) %>%
  summarise(
    n = n(),
    female_percentage = mean(gender == 1) * 100,
    mean_age = mean(age, na.rm = TRUE),
    age_range = paste(min(age, na.rm = TRUE), "-", max(age, na.rm = TRUE)),
    mean_risktaking = mean(Z_score_risktaking, na.rm = TRUE)
  )

table_data_WVS

R code to count observations by country in the WVS_data dataset

country_counts <- WVS_data %>%
  count(country)

# Print the result
print(country_counts)

View the distribution of the ‘hardship_index’ column for each country

hardship_index_distribution <- hardship %>%
  group_by(country) %>%
  summarize(
    mean = mean(hardship, na.rm = TRUE),
    median = median(hardship, na.rm = TRUE),
    sd = sd(hardship, na.rm = TRUE),
    min = min(hardship, na.rm = TRUE),
    max = max(hardship, na.rm = TRUE),
    n = sum(!is.na(hardship))
  )

# Print the result
print(hardship_index_distribution)

VISUALIZATION #################### #################### ####################

#World map

world_map <- map_data("world")
recorded_countries <- unique(WVS_data$country)
world_map$recorded <- ifelse(world_map$region %in% recorded_countries, "Recorded", "Not Recorded")

ggplot(world_map, aes(x = long, y = lat, group = group, fill = recorded)) + 
  geom_polygon(color = "white") +
  scale_fill_manual(values = c("Recorded" = "red", "Not Recorded" = "lightgrey"), guide = "none") +
  theme_void() +
  labs(title = "WVS", fill = "Status") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5))

#graph across countries: risk taking vs age vs gender (Z-score for age and risk taking)

# Risk vs age with color-coded gender per Country
# Risk vs age with color-coded gender per Country
# Skalierung des Z-Scores für das Alter anpassen
WVS_data$z_score_age_scaled <- 15 * WVS_data$z_score_age + 42


ggplot(WVS_data, aes(z_score_age_scaled, Z_score_risktaking, color = as.factor(gender))) +
  geom_point(position = position_jitter(width = 0.1, height = 0.1), size = 0.1) +  
  geom_smooth(method = "lm") +
  geom_vline(xintercept = 42, linetype = "dashed", color = "black", size = 1) +  
  scale_color_manual(values = c("blue", "red"), labels = c("Male", "Female")) +
  labs(color = "Gender") +
  xlab("Age") +
  ylab("Risk Taking") +
  scale_x_continuous(breaks = seq(0, 100, by = 15), limits = c(0, 100)) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))


WVS_data

#regression table (risk taking and age -> Z-score)

regression_results_WVS <- WVS_data %>%
  group_by(country) %>%
  do(model = lm(Z_score_risktaking ~ scale(age) + gender, data = .)) %>%
  summarize(
    country = first(country),
    intercept = coef(summary(model))[1, 1],
    slope_age = coef(summary(model))[2, 1],
    slope_gender = coef(summary(model))[3, 1]
  )

regression_results_WVS

#table intercept and slope

regression_results_gps <- gps_data %>%
  group_by(country) %>%
  do(model = lm(risktaking ~ z_score_age + gender, data = .)) %>%
  summarize(
    country = first(country),
    intercept = coef(summary(model))[1, 1],
    slope_age = coef(summary(model))[2, 1],
    slope_gender = coef(summary(model))[3, 1]
  )

regression_results_gps

Countries, that are in both datasets

common_countries <- intersect(WVS_data$country, gps_data$country)
common_countries
 [1] "Argentina"      "Australia"      "Brazil"         "Canada"         "Chile"          "China"          "Egypt"         
 [8] "Finland"        "France"         "Georgia"        "Germany"        "Ghana"          "Hungary"        "India"         
[15] "Indonesia"      "Iran"           "Japan"          "Mexico"         "Moldova"        "Morocco"        "Netherlands"   
[22] "Peru"           "Poland"         "Romania"        "Russia"         "Rwanda"         "South Africa"   "South Korea"   
[29] "Spain"          "Sweden"         "Switzerland"    "Thailand"       "Turkey"         "Ukraine"        "United Kingdom"
[36] "Algeria"        "Colombia"       "Estonia"        "Haiti"          "Iraq"           "Jordan"         "Kazakhstan"    
[43] "Nigeria"        "Pakistan"       "Philippines"    "United States"  "Zimbabwe"      

Filtering Selected Countries from dataset gps_data and creating a new set

# Countries that are in both datasets
common_countries <- intersect(WVS_data$country, gps_data$country)

# Filter original dataset based on common countries
new_gps <- gps_data[gps_data$country %in% common_countries, ]

# View the new dataset
new_gps

Regression Analysis of Risk-Taking Behavior in New WVS Data

regression_results_WVS_new <- new_WVS %>%
  group_by(country) %>%
  do(model = lm(Z_score_risktaking ~ scale(age) + gender, data = .)) %>%
  summarize(
    country = first(country),
    intercept_WVS = coef(summary(model))[1, 1],
    slope_age_WVS = coef(summary(model))[2, 1],
    slope_gender_WVS = coef(summary(model))[3, 1]
  )

regression_results_WVS_new

Regression Analysis of Risk-Taking Behavior in new_gps Data

regression_results_gps_new <- new_gps %>%
  group_by(country) %>%
  do(model = lm(risktaking ~ scale(age) + gender, data = .)) %>%
  summarize(
    country = first(country),
    intercept_gps = coef(summary(model))[1, 1],
    slope_age_gps = coef(summary(model))[2, 1],
    slope_gender_gps = coef(summary(model))[3, 1]
  )

regression_results_gps_new

#Merging Regression Results with Additional Data and Hardship Index

regression_results_gps_new
regression_results_WVS_new

# Assuming "country" is the common column
merged_results <- merge(regression_results_gps_new, regression_results_WVS_new, by = "country", all = TRUE)

# Read data from the Excel file
new_data <- read_excel("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/Hardship/Hardship_complete_2024.xlsx")

# Now you can work with the 'new_data' object
print(new_data)

# Perform the left_join operation
new_data <- left_join(merged_results, new_data, by = "country")

# Select specific columns
new_data <- new_data %>%
  dplyr::select(country, intercept_gps, slope_age_gps, slope_gender_gps, intercept_WVS, slope_age_WVS, slope_gender_WVS, isocode)

# Print the final data
print(new_data)

hardship_index <- read_excel("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/Hardship/Hardship_complete_2024.xlsx")
print(hardship_index)

hardship_data_complete <- left_join(regression_results_WVS, hardship_index, by = "country")
hardship_data_complete

log transform

hardship_data_complete$mean_homicide=log(hardship_data_complete$mean_homicide)
hardship_data_complete$gdp=log(hardship_data_complete$gdp)
hardship_data_complete$Infant_mortality=log(hardship_data_complete$Infant_mortality)
hardship_data_complete$life_expect=log(hardship_data_complete$life_expect)
hardship_data_complete$gini_income=log(hardship_data_complete$gini_income)
hardship_data_complete$primary_female_enrollment_rate=log(hardship_data_complete$primary_female_enrollment_rate)

# changing variables into the same direction

# Reverse Codierung
hardship_data_complete$mean_homicide=scale(hardship_data_complete$mean_homicide)
hardship_data_complete$gdp=scale(-hardship_data_complete$gdp)
hardship_data_complete$Infant_mortality=scale(hardship_data_complete$Infant_mortality)
hardship_data_complete$life_expect=scale(-hardship_data_complete$life_expect)
hardship_data_complete$gini_income=scale(hardship_data_complete$gini_income)
hardship_data_complete$primary_female_enrollment_rate=scale(hardship_data_complete$primary_female_enrollment_rate)

hardship_data_complete

create a hardship index

hardship_data_complete$hardship=(hardship_data_complete$mean_homicide+hardship_data_complete$gdp+hardship_data_complete$gini_income+hardship_data_complete$life_expect+hardship_data_complete$Infant_mortality+hardship_data_complete$primary_female_enrollment_rate)/6

hardship_data_complete

Comparison of Intercept Values between GPS and WVS Data

# Plotting comparing interecepts
ggplot(new_data, aes(x = intercept_gps, y = intercept_WVS, label = isocode)) +
  geom_point(size = 1.5) +
  geom_text(aes(label = isocode), vjust = -0.5, hjust = -0.5) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(title = "Comparison of Intercept Values",
       x = "Intercept_gps",
       y = "Intercept_WVS") +
  theme_minimal() +
  xlim(c(0, 1.2)) +
  ylim(c(0, 1.2)) +
  coord_fixed()


# Assuming you have a data frame named 'new_data' with columns 'intercept_gps', 'intercept_WVS', and 'isocode'

ggplot(new_data, aes(x = intercept_gps, y = intercept_WVS, label = isocode)) +
  geom_point(size = 3) +
  geom_text_repel(
    aes(label = isocode),
    box.padding = 0.5,
    point.padding = 0.1,
    force = 5
  ) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(x = "Intercept Global Preference Study",
       y = "Intercept World Value Survey") +
  theme_minimal() +
  xlim(c(0, 1.07)) +
  ylim(c(0, 1.07)) +
  coord_fixed()


# Annotate with word cloud
wordcloud(words = new_data$isocode, freq = rep(1, nrow(new_data)), scale = c(2, 0.5))


# Annotate with word cloud
wordcloud(words = new_data$isocode, freq = rep(1, nrow(new_data)), scale = c(2, 0.5))


# Assuming merged_results has columns intercept_gps and intercept_WVS
model <- lm(intercept_WVS ~ intercept_gps, data = merged_results)

# View the summary of the regression model
summary(model)

Call:
lm(formula = intercept_WVS ~ intercept_gps, data = merged_results)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.64518 -0.13560 -0.00272  0.16597  0.70522 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.27537    0.04179   6.590 4.14e-08 ***
intercept_gps  0.48328    0.13549   3.567 0.000871 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.266 on 45 degrees of freedom
Multiple R-squared:  0.2204,    Adjusted R-squared:  0.2031 
F-statistic: 12.72 on 1 and 45 DF,  p-value: 0.0008713
# Calculate the correlation
correlation <- cor(merged_results$intercept_gps, merged_results$intercept_WVS)

# Print the correlation coefficient
print(correlation)
[1] 0.469472

#Comparison of the Effect of Age on Risk Taking between GPS and WVS Data

# Plotting using ggplot2
ggplot(new_data, aes(x = slope_age_gps, y = slope_age_WVS, label = isocode)) +
  geom_point(size = 3) +
  geom_text_repel(
    aes(label = isocode),
    box.padding = 0.5,
    point.padding = 0.1,
    force = 5
  ) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(x = "Effect of Age on Risk Taking Global Preference Study",
       y = "Effect of Age on Risk Taking World Value Survey") +
  theme_minimal() +
  xlim(-0.5, 0) +
  ylim(c(-0.5, 0)) +
  coord_fixed()


new_data

correlation <- cor(new_data$slope_age_gps, new_data$slope_age_WVS)

# Print the correlation coefficient
print(correlation)
[1] 0.4154239

#Comparison of the Effect of Gender on Risk Taking between GPS and WVS Data

# Plotting using ggplot2
ggplot(new_data, aes(x = slope_gender_gps, y = slope_gender_WVS, label = isocode)) +
  geom_point(size = 3) +
  geom_text_repel(
    aes(label = isocode),
    box.padding = 0.5,
    point.padding = 0.1,
    force = 5
  ) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(x = "Effect of Gender on Risk Taking Global Preference Study",
       y = "Effect of Gender on Risk Taking World Value Survey") +
  theme_minimal() +
  xlim(-0.6, 0.12) +
  ylim(c(-0.6, 0.12)) +
  coord_fixed()


new_data

correlation <- cor(new_data$slope_gender_gps, new_data$slope_gender_WVS)

# Print the correlation coefficient
print(correlation)
[1] 0.2821009

#Calculation of Hardship Index for WVS Data

#hardship for WVS
hardship_values <- read_excel("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/Hardship/hardship_complete_2024.xlsx") 

labels <- c("country", "mean_homicide", "gdp", "gini_income", "Infant_mortality", "life_expect", "isocode", "primary_female_enrollment_rate")

print(hardship_values)

# Replace the column names as per your actual column names
# Z-standardize specific columns
hardship_values$gdp <- scale(hardship_values$gdp)
hardship_values$gini_income <- scale(hardship_values$gini_income)
hardship_values$Infant_mortality <- scale(hardship_values$Infant_mortality)
hardship_values$life_expect <- scale(hardship_values$life_expect)
hardship_values$mean_homicide <- scale(hardship_values$mean_homicide)
hardship_values$primary_female_enrollment_rate <- scale(hardship_values$primary_female_enrollment_rate)

hardship_values

hardship_values <- hardship_values%>%
  mutate(hardship = (mean_homicide + gdp + Infant_mortality + life_expect + gini_income + primary_female_enrollment_rate) / 6)
hardship_values
hardship_data_complete <- left_join(regression_results_WVS, hardship_values, by = "country")
hardship_data_complete

#Relationship between Hardship and Risk Taking for WVS Data

#For WVS
ggplot(hardship_data_complete, aes(x = hardship, y = intercept, label = isocode)) +
  geom_point(size = 3) +
  geom_text_repel(
    aes(label = isocode),
    box.padding = 0.5,
    point.padding = 0.1,
    force = 5
  ) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(x = "Hardship",
       y = "Risk Taking") +
  theme_minimal() +
  xlim(-2, 2) +
  ylim(-0.6, 1) +
  coord_fixed(ratio = 2.5)

Association between Hardship and Age Effect on Risk Taking for WVS Data

#For WVS
ggplot(hardship_data_complete, aes(x = hardship, y = slope_age, label = isocode)) +
  geom_point(size = 3) +
  geom_text_repel(
    aes(label = isocode),
    box.padding = 0.5,
    point.padding = 0.1,
    force = 5
  ) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(x = "Hardship",
       y = "Age Effect") +
  theme_minimal() +
   xlim(-2, 2) +
  coord_fixed(ratio = 8)

Relationship between Hardship and Risk Taking with Regression Line

ggplot(hardship_data_complete, aes(x = hardship, y = intercept, label = isocode)) +
  geom_point(size = 3) +
  geom_text_repel(
    aes(label = isocode),
    box.padding = 0.5,
    point.padding = 0.1,
    force = 5
  ) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(x = "Hardship",
       y = "Risk Taking") +
  theme_minimal() +
  coord_fixed()

Linear Model Summary: Hardship and Risk Taking Relationship

# Lineares Modell für den ersten Fall
model_intercept <- lm(hardship ~ intercept, data = hardship_data_complete)
summary_intercept <- summary(model_intercept)
print(summary_intercept)

Call:
lm(formula = hardship ~ intercept, data = hardship_data_complete)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.6388 -0.2009 -0.0141  0.1770  1.0821 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.05232    0.06421  -0.815    0.418
intercept    0.12196    0.13847   0.881    0.381

Residual standard error: 0.3426 on 74 degrees of freedom
Multiple R-squared:  0.01037,   Adjusted R-squared:  -0.002999 
F-statistic: 0.7758 on 1 and 74 DF,  p-value: 0.3813
# Correlation Hardship und Risk Taking
correlation <- cor(hardship_data_complete$hardship, hardship_data_complete$intercept)

print(paste("Correlation Hardship und Risk Taking:", correlation))
[1] "Correlation Hardship und Risk Taking: 0.101856818032701"

Linear Model Summary: Relationship Between Hardship and Age Effect on Risk Taking

# Lineares Modell für den ersten Fall
model_intercept <- lm(hardship ~ slope_age, data = hardship_data_complete)
summary_intercept <- summary(model_intercept)
print(summary_intercept)

Call:
lm(formula = hardship ~ slope_age, data = hardship_data_complete)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.6855 -0.1981 -0.0007  0.1342  1.1061 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.03575    0.09073  -0.394    0.695
slope_age   -0.14672    0.42568  -0.345    0.731

Residual standard error: 0.3441 on 74 degrees of freedom
Multiple R-squared:  0.001603,  Adjusted R-squared:  -0.01189 
F-statistic: 0.1188 on 1 and 74 DF,  p-value: 0.7313
# Correlation Hardship und Risk Taking
correlation <- cor(hardship_data_complete$hardship, hardship_data_complete$slope_age)

print(paste("Correlation Hardship und Risk Taking:", correlation))
[1] "Correlation Hardship und Risk Taking: -0.0400350639522652"

Linear Model Summary: Relationship Between Hardship and Gender Effect on Risk Taking

# Lineares Modell für den ersten Fall
model_intercept <- lm(hardship ~ slope_gender, data = hardship_data_complete)
summary_intercept <- summary(model_intercept)
print(summary_intercept)

Call:
lm(formula = hardship ~ slope_gender, data = hardship_data_complete)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.55821 -0.18400 -0.01724  0.13650  0.99214 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)   -0.1881     0.0926  -2.031   0.0458 *
slope_gender  -0.7764     0.3626  -2.141   0.0355 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3342 on 74 degrees of freedom
Multiple R-squared:  0.05834,   Adjusted R-squared:  0.04562 
F-statistic: 4.585 on 1 and 74 DF,  p-value: 0.03555
# Correlation Hardship und Risk Taking
correlation <- cor(hardship_data_complete$hardship, hardship_data_complete$slope_gender)

print(paste("Correlation Hardship und Risk Taking:", correlation))
[1] "Correlation Hardship und Risk Taking: -0.241543858957759"

Analysis of Risk Taking vs. Age with Gender Factor in WVS Data

WVS_data
# Lineares Modell für Risk Taking vs. Age
model_risk_age <- lm(Z_score_risktaking ~ z_score_age + factor(gender), data = WVS_data)
summary_risk_age <- summary(model_risk_age)
print(summary_risk_age)

Call:
lm(formula = Z_score_risktaking ~ z_score_age + factor(gender), 
    data = WVS_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.9043 -0.8023 -0.1176  0.7837  2.6654 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)      0.131135   0.003656   35.87   <2e-16 ***
z_score_age     -0.184692   0.002531  -72.98   <2e-16 ***
factor(gender)2 -0.251665   0.005064  -49.69   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.975 on 148524 degrees of freedom
Multiple R-squared:  0.04944,   Adjusted R-squared:  0.04942 
F-statistic:  3862 on 2 and 148524 DF,  p-value: < 2.2e-16
correlation <- by(WVS_data, WVS_data$gender, function(x) cor(x$z_score_age, x$Z_score_risktaking))

print(paste("Correlation Hardship und Risk Taking:", correlation))
[1] "Correlation Hardship und Risk Taking: -0.200207985711739" "Correlation Hardship und Risk Taking: -0.172610623925891"

show new_data

new_data

Comparison of Gender Effects on Risk Taking Between Global Preference Study and World Value Survey Data

# Lineares Modell für Risk Taking vs. Age
model <- lm(slope_gender_gps ~ slope_gender_WVS, data = new_data)
summary_model <- summary(model)
print(summary_model)

Call:
lm(formula = slope_gender_gps ~ slope_gender_WVS, data = new_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.37268 -0.06468 -0.02119  0.09295  0.31794 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)   
(Intercept)      -0.13779    0.04304  -3.202  0.00251 **
slope_gender_WVS  0.33943    0.17208   1.973  0.05472 . 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1248 on 45 degrees of freedom
Multiple R-squared:  0.07958,   Adjusted R-squared:  0.05913 
F-statistic: 3.891 on 1 and 45 DF,  p-value: 0.05472
correlation <- cor(new_data$slope_age_gps, new_data$slope_age_WVS)
print(paste("Correlation Hardship und Risk Taking:", correlation))
[1] "Correlation Hardship und Risk Taking: 0.415423889806963"

Relationship between Hardship and Gender Effect on Risk Taking

ggplot(hardship_data_complete, aes(x = hardship, y = slope_gender, label = isocode)) +
  geom_point(size = 3) +
  geom_text_repel(
    aes(label = isocode),
    box.padding = 0.5,
    point.padding = 0.1,
    force = 5
  ) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(x = "Hardship",
       y = "Gender Effect") +
  theme_minimal() +
   xlim(-2, 2) +
  coord_fixed(ratio = 6)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShtYXBzKQpsaWJyYXJ5KGhhdmVuKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkod29yZGNsb3VkKQpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjClBSRVBBUkFUSU9OIERBVEFTRVRTIEZPUiBBTkFMWVNJUwojIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMKUFJFUCBUSEUgREFUQVNFVCBGT1IgQU5BTFlTSVMgV1ZTIDUgJiA2CiMjIyMjIyMjIyMjIyMjIyMjIyMjCgojcmVhZCB0aGUgZGF0YSAoV2F2ZSA1KQpgYGB7cn0KIyBEYXRhIG9mIFdhdmUgNQpXVjVfZGF0YSA8LSByZWFkUkRTKCIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvV1Y2X2RhdGFzZXRfd2F2ZV81XzYvRjAwMDA3OTQ0LVdWNV9EYXRhX1JfdjIwMTgwOTEyLnJkcyIpCgojIENvbnZlcnQgV1Y1X2RhdGEtb2JqZWN0IGluIGRhdGEuZnJhbWUgCldWNV9kYXRhX2RmIDwtIGFzLmRhdGEuZnJhbWUoV1Y1X2RhdGEpCgojIHNob3cgZmlyc3QgZml2ZSBjb2x1bW5zCldWNV9kYXRhX2RmCmBgYAoKIyBjbGVhbiB0aGUgZGF0YSBzZXQKYGBge3J9CiNyZW5hbWUgdGhlIHZhcmlhYmxlcwpXVjVfZGF0YSA8LSBXVjVfZGF0YV9kZiAlPiUKICByZW5hbWUoZ2VuZGVyID0gVjIzNSwgYWdlID0gVjIzNywgY291bnRyeV9jb2RlID0gVjIsIHdhdmUgPSBWMSwgcmlza3Rha2luZyA9IFY4NiwgY2hpbGRyZW4gPSBWNTYsIG1hcnJpZWQgPSBWNTUsIGVtcGxveWVkID0gVjI0MSwgZWR1Y2F0aW9uID0gVjIzOCkKV1Y1X2RhdGEKCmNvbG5hbWVzKFdWNV9kYXRhKQoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgZW1wbG95ZWQsIGVkdWNhdGlvbiwgbWFycmllZCkKV1Y1X2RhdGEKYGBgCiMgUmVhZCBjb3VudHJ5bmFtZXMgZGF0YSBmcm9tIHRoZSBDU1YgZmlsZSAodG8gZGVjb2RlIHRoZSBkYXRhc2V0IDUpCmBgYHtyfQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9XVjZfZGF0YXNldF93YXZlXzVfNi9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKIyBBc3N1bWluZyBXVjVfZGF0YSBoYXMgYSBjb2x1bW4gbmFtZWQgY291bnRyeV9jb2RlCldWNV9kYXRhJGNvdW50cnkgPC0gY291bnRyeW5hbWVzJG5hbWVbbWF0Y2goV1Y1X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCgojIENoZWNrIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBjb3VudHJ5IGluIHRoZSBuZXcgY29sdW1uCnRhYmxlKFdWNV9kYXRhJGNvdW50cnkpCgojIERpc3BsYXkgdGhlIHVwZGF0ZWQgV1Y1X2RhdGEKcHJpbnQoV1Y1X2RhdGEpCmBgYAoKI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQpgYGB7cn0KV1Y2X2RhdGEgPC0gbG9hZCgiL1VzZXJzL2xhdXJhYmF6emlnaGVyL0RvY3VtZW50cy9HaXRIdWIvcmlza193dnMvZGF0YS9kYXRhc2V0L1dWNl9kYXRhc2V0X3dhdmVfNV82L1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IApwcmludChXVjZfZGF0YSkKYGBgCgojcmVuYW1lIHZhcmlhYmxlcwpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCiNzZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0CldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoZ2VuZGVyLCBhZ2UsIGNvdW50cnlfY29kZSwgd2F2ZSwgcmlza3Rha2luZywgY2hpbGRyZW4sIGVtcGxveWVkLCBlZHVjYXRpb24sIG1hcnJpZWQpCldWNl9kYXRhCmBgYAoKI2RlY29kZSBkYXJhc2V0IChXYXZlIDYpCmBgYHtyfQpjb3VudHJ5bmFtZXMgPSByZWFkLmNzdigiL1VzZXJzL2xhdXJhYmF6emlnaGVyL0RvY3VtZW50cy9HaXRIdWIvcmlza193dnMvZGF0YS9kYXRhc2V0L1dWNl9kYXRhc2V0X3dhdmVfNV82L2NvdW50cnluYW1lcy50eHQiLCBoZWFkZXI9RkFMU0UsYXMuaXM9VFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA9IGMoImNvZGUiLCAibmFtZSIpCldWNl9kYXRhJGNvdW50cnkgPSBjb3VudHJ5bmFtZXMkbmFtZSBbbWF0Y2goV1Y2X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCnRhYmxlKFdWNl9kYXRhJGNvdW50cnkpCldWNl9kYXRhCmBgYAoKI2NvbWJpbmUgdGhlIDIgZGF0YXNldCAoV2F2ZSA2ICsgV2F2ZSA1KQpgYGB7cn0KV1Y1X2RhdGEKV1Y2X2RhdGEKV1ZTX2RhdGEgPSByYmluZChXVjVfZGF0YSwgV1Y2X2RhdGEpCldWU19kYXRhCmBgYAoKI2V4Y2x1c2lvbiBvZiBwYXJ0aWNpcGFudHMgYW5kIG9taXNzaW9uIG9mIG1pc3NpbmcgZGF0YSAobmEpCmBgYHtyfQpXVlNfZGF0YSA9IHN1YnNldChXVlNfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNSA9IHN1YnNldChXVjVfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNiA9IHN1YnNldChXVjZfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkKZGF0YV9XYXZlNSA8LSBuYS5vbWl0KGRhdGFfV2F2ZTUpCmRhdGFfV2F2ZTYgPC0gbmEub21pdChkYXRhX1dhdmU2KQoKIyBVc2UgdGhlIG11dGF0ZSBmdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGNvdW50cnkgbmFtZQpXVlNfZGF0YSA8LSBXVlNfZGF0YSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGlmZWxzZShjb3VudHJ5ID09ICJHcmVhdCBCcml0YWluIiwgIlVuaXRlZCBLaW5nZG9tIiwgY291bnRyeSkpCmBgYAoKI1RyYW5zZm9ybWF0aW9uIG9mIGl0ZW0gcmlza3Rha2luZwpgYGB7cn0KIyBUcmFuc2Zyb20gcmlzayBpdGVtIHN1Y2ggdGhhdCBoaWdoIHZhbHVlcyByZXByZXNlbnQgbW9yZSByaXNrIHRha2luZwpXVlNfZGF0YSRyaXNrdGFraW5nID0gNiAtIFdWU19kYXRhJHJpc2t0YWtpbmcgKyAxCgojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpXVlNfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgPSAxMCpzY2FsZShXVlNfZGF0YSRyaXNrdGFraW5nLCBjZW50ZXI9VFJVRSxzY2FsZT1UUlVFKSs1MAoKV1ZTX2RhdGEKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCiMgQXNzdW1pbmcgVC1zY29yZXMgaGF2ZSBhIG1lYW4gb2YgNTAgYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDEwCldWU19kYXRhJFpfc2NvcmVfcmlza3Rha2luZyA9IChXVlNfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgLSA1MCkgLyAxMAoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoV1ZTX2RhdGEpCgpXVlNfZGF0YSA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoel9zY29yZV9hZ2UgPSBzY2FsZShhZ2UpKQpXVlNfZGF0YQpgYGAKCiMgRGljaG90b21pemluZyBWYXJpYWJsZXM6IFRoaXMgaGVscHMgZXN0aW1hdGluZyBhbmQgaW50ZXJwcmV0aW5nIHRoZSBtb2RlbHMgbGF0ZXIgb24uLi4KYGBge3J9CldWU19kYXRhJGdlbmRlciA9IGlmZWxzZShXVlNfZGF0YSRnZW5kZXIgPT0gMSwgMCwgMSkgIyBzZXg6IG1hbGUgdnMuIGZlbWFsZQpXVlNfZGF0YSRjaGlsZHJlbiA9IGlmZWxzZShXVlNfZGF0YSRjaGlsZHJlbiA9PSAwLCAwLCAxKSAjIGNoaWxkcmVuOiBubyB2cy4geWVzCldWU19kYXRhJG1hcnJpZWQgPSBpZmVsc2UoV1ZTX2RhdGEkbWFycmllZCA9PSAxLCAxLCAwKSAjIG1hcnJpZWQ6IHllcyB2cy4gbm8KV1ZTX2RhdGEkZW1wbG95ZWQgPSBpZmVsc2UoV1ZTX2RhdGEkZW1wbG95ZWQgPCA0LCAxLCAwKSAjIGVtcGxveWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVkdWNhdGlvbiA9IGlmZWxzZShXVlNfZGF0YSRlZHVjYXRpb24gPCA0LCAwLCAxKSAjIGVkdWNhdGlvbjogbm8gcHJpbWFyeSB2cy4gcHJpbWFyeSsgCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMKUFJFUCBUSEUgREFUQVNFVCBGT1IgQU5BTFlTSVMgR1BTCiMjIyMjIyMjIyMjIyMjIyMjIyMjCgojQWRkIGRhdGEgR1BTCmBgYHtyfQpncHNfZGF0YSA8LSBoYXZlbjo6cmVhZF9kdGEoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9HUFNfZGF0YXNldF9pbmRpdmlkdWFsX2xldmVsL2luZGl2aWR1YWxfbmV3LmR0YSIpCgpoZWFkKGdwc19kYXRhKQpgYGAKCiMgQ2xlYW4gdGhlIGRhdGEgYnkgcmVtb3ZpbmcgcmVjb3JkcyB3aXRoIG1pc3NpbmcgdmFsdWVzCmBgYHtyfQpncHNfZGF0YSA8LSBncHNfZGF0YSAlPiUKICBkcm9wX25hKGNvdW50cnksIGlzb2NvZGUsIHJpc2t0YWtpbmcsIGdlbmRlciwgYWdlKQoKIyBEaXNwbGF5IHRoZSBjbGVhbmVkIGRhdGEKZ3BzX2RhdGEKYGBgCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApgYGB7cn0KZ3BzX2RhdGEgPC0gZ3BzX2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBpc29jb2RlLCBpc29uLCByaXNrdGFraW5nLCBnZW5kZXIsIGFnZSkKZ3BzX2RhdGEKYGBgCiMgVHJhbnNmb3JtIGFnZSAoei1zY29yZSkKYGBge3J9Cmdwc19kYXRhIDwtIGdwc19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCgojIERpc3BsYXkgdGhlIG5ldyBjb2x1bW4gd2l0aCBaLVNjb3JlcyBwZXIgQ291bnRyeQpncHNfZGF0YQpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjClBSRVAgVEhFIERBVEFTRVQgRk9SIEFOQUxZU0lTIEhBUkRTSElQCiMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIHJlYWQgaW4gZmlsZSB0aGF0IGNvbnRhaW5zIGhhcmRzaGlwIGluZGljYXRvcnMgbWFudWFsbHkgY29sbGVjdGVkIGZyb20gQ0lBIGZhY3Rib29rLCBXSE8sIGFuZCBXb3JsZCBCYW5rIApgYGB7cn0KZXhjZWxfcGF0aCA8LSAiL1VzZXJzL2xhdXJhYmF6emlnaGVyL0RvY3VtZW50cy9HaXRIdWIvcmlza193dnMvZGF0YS9kYXRhc2V0L0hhcmRzaGlwL0hhcmRzaGlwX2NvbXBsZXRlXzIwMjQueGxzeCIKaGFyZHNoaXAgPC0gcmVhZF9leGNlbChleGNlbF9wYXRoKQoKIyBDcmVhdGUgYSB2ZWN0b3Igb2YgbGFiZWxzIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiAnY291bnRyeWZhY3RzJwpsYWJlbHMgPC0gYygiY291bnRyeSIsIm1lYW5faG9taWNpZGUiLCJnZHAiLCJnaW5pX2luY29tZSIsIkluZmFudF9tb3J0YWxpdHkiLCJsaWZlX2V4cGVjdCIsInByaW1hcnlfZmVtYWxlX2Vucm9sbG1lbnRfcmF0ZSIpCgojIFByaW50IHRoZSByZXN1bHQKcHJpbnQoaGFyZHNoaXApCmBgYAoKCiMgQ3JlYXRlIHRoZSAnaGFyZHNoaXAnIGNvbHVtbiBpbiB0aGUgJ2hhcmRzaGlwJyBkYXRhIGZyYW1lCmBgYHtyfQojIENyZWF0ZSB0aGUgJ2hhcmRzaGlwJyBjb2x1bW4gaW4gdGhlICdoYXJkc2hpcCcgZGF0YSBmcmFtZQpoYXJkc2hpcCA8LSBoYXJkc2hpcCAlPiUKICBtdXRhdGUoaGFyZHNoaXAgPSAobWVhbl9ob21pY2lkZSArIGdkcCArIGdpbmlfaW5jb21lICsgSW5mYW50X21vcnRhbGl0eSArIGxpZmVfZXhwZWN0ICsgcHJpbWFyeV9mZW1hbGVfZW5yb2xsbWVudF9yYXRlKSAvIDYpCmhhcmRzaGlwCmBgYAojIGxvZyB0cmFuc2Zvcm0KYGBge3J9CmhhcmRzaGlwJG1lYW5faG9taWNpZGU9bG9nKGhhcmRzaGlwJG1lYW5faG9taWNpZGUpCmhhcmRzaGlwJGdkcD1sb2coaGFyZHNoaXAkZ2RwKQpoYXJkc2hpcCRJbmZhbnRfbW9ydGFsaXR5PWxvZyhoYXJkc2hpcCRJbmZhbnRfbW9ydGFsaXR5KQpoYXJkc2hpcCRsaWZlX2V4cGVjdD1sb2coaGFyZHNoaXAkbGlmZV9leHBlY3QpCmhhcmRzaGlwJGdpbmlfaW5jb21lPWxvZyhoYXJkc2hpcCRnaW5pX2luY29tZSkKaGFyZHNoaXAkcHJpbWFyeV9mZW1hbGVfZW5yb2xsbWVudF9yYXRlPWxvZyhoYXJkc2hpcCRwcmltYXJ5X2ZlbWFsZV9lbnJvbGxtZW50X3JhdGUpCgojIGNoYW5naW5nIHZhcmlhYmxlcyBpbnRvIHRoZSBzYW1lIGRpcmVjdGlvbgoKIyBSZXZlcnNlIENvZGllcnVuZwpoYXJkc2hpcCRtZWFuX2hvbWljaWRlPXNjYWxlKGhhcmRzaGlwJG1lYW5faG9taWNpZGUpCmhhcmRzaGlwJGdkcD1zY2FsZSgtaGFyZHNoaXAkZ2RwKQpoYXJkc2hpcCRJbmZhbnRfbW9ydGFsaXR5PXNjYWxlKGhhcmRzaGlwJEluZmFudF9tb3J0YWxpdHkpCmhhcmRzaGlwJGxpZmVfZXhwZWN0PXNjYWxlKC1oYXJkc2hpcCRsaWZlX2V4cGVjdCkKaGFyZHNoaXAkZ2luaV9pbmNvbWU9c2NhbGUoaGFyZHNoaXAkZ2luaV9pbmNvbWUpCmhhcmRzaGlwJHByaW1hcnlfZmVtYWxlX2Vucm9sbG1lbnRfcmF0ZT1zY2FsZShoYXJkc2hpcCRwcmltYXJ5X2ZlbWFsZV9lbnJvbGxtZW50X3JhdGUpCgpoYXJkc2hpcApgYGAKCiMgY3JlYXRlIGEgaGFyZHNoaXAgaW5kZXgKYGBge3J9CmhhcmRzaGlwJGhhcmRzaGlwPShoYXJkc2hpcCRtZWFuX2hvbWljaWRlK2hhcmRzaGlwJGdkcCtoYXJkc2hpcCRnaW5pX2luY29tZStoYXJkc2hpcCRsaWZlX2V4cGVjdCtoYXJkc2hpcCRJbmZhbnRfbW9ydGFsaXR5K2hhcmRzaGlwJHByaW1hcnlfZmVtYWxlX2Vucm9sbG1lbnRfcmF0ZSkvNgoKaGFyZHNoaXAKYGBgCgojIyMjIyMjIyMjIyMjIyMjIyMjIwpQUkVQIFRIRSBEQVRBU0VUIEZPUiBBTkFMWVNJUyBNSVhFRC1NT0RFTFMKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiNBZGQgSGFyZHNoaXAgdG8gV1ZTX2RhdGEKYGBge3J9CldWU19taXhlZF9tb2RlbCA8LSBsZWZ0X2pvaW4oV1ZTX2RhdGEsIGhhcmRzaGlwLCBieSA9ICJjb3VudHJ5IikKV1ZTX21peGVkX21vZGVsCmBgYAoKI0FkZCBIYXJkc2hpcCB0byBncHNfZGF0YQpgYGB7cn0KZ3BzX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihncHNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpncHNfbWl4ZWRfbW9kZWwKYGBgCgojIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIwpERVNDUklQVElWRSBJTkZPUk1BVElPTiAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiN0YWJsZSB3aXRoIGZlbWFsZSBwZXJjZW50YWdlLCBtZWFuIGFnZSwgbWVhbiByaXNrIHRha2luZyBwZXIgY291bnRyaWVzIChzdW1tYXJ5IG9mIHRoZSBjb3VudHJpZXMpCmBgYHtyfQp0YWJsZV9kYXRhX1dWUyA8LSBXVlNfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gbigpLAogICAgZmVtYWxlX3BlcmNlbnRhZ2UgPSBtZWFuKGdlbmRlciA9PSAxKSAqIDEwMCwKICAgIG1lYW5fYWdlID0gbWVhbihhZ2UsIG5hLnJtID0gVFJVRSksCiAgICBhZ2VfcmFuZ2UgPSBwYXN0ZShtaW4oYWdlLCBuYS5ybSA9IFRSVUUpLCAiLSIsIG1heChhZ2UsIG5hLnJtID0gVFJVRSkpLAogICAgbWVhbl9yaXNrdGFraW5nID0gbWVhbihaX3Njb3JlX3Jpc2t0YWtpbmcsIG5hLnJtID0gVFJVRSkKICApCgp0YWJsZV9kYXRhX1dWUwpgYGAKCiMgUiBjb2RlIHRvIGNvdW50IG9ic2VydmF0aW9ucyBieSBjb3VudHJ5IGluIHRoZSBXVlNfZGF0YSBkYXRhc2V0CmBgYHtyfQpjb3VudHJ5X2NvdW50cyA8LSBXVlNfZGF0YSAlPiUKICBjb3VudChjb3VudHJ5KQoKIyBQcmludCB0aGUgcmVzdWx0CnByaW50KGNvdW50cnlfY291bnRzKQpgYGAKCiMgVmlldyB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSAnaGFyZHNoaXBfaW5kZXgnIGNvbHVtbiBmb3IgZWFjaCBjb3VudHJ5CmBgYHtyfQpoYXJkc2hpcF9pbmRleF9kaXN0cmlidXRpb24gPC0gaGFyZHNoaXAgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXplKAogICAgbWVhbiA9IG1lYW4oaGFyZHNoaXAsIG5hLnJtID0gVFJVRSksCiAgICBtZWRpYW4gPSBtZWRpYW4oaGFyZHNoaXAsIG5hLnJtID0gVFJVRSksCiAgICBzZCA9IHNkKGhhcmRzaGlwLCBuYS5ybSA9IFRSVUUpLAogICAgbWluID0gbWluKGhhcmRzaGlwLCBuYS5ybSA9IFRSVUUpLAogICAgbWF4ID0gbWF4KGhhcmRzaGlwLCBuYS5ybSA9IFRSVUUpLAogICAgbiA9IHN1bSghaXMubmEoaGFyZHNoaXApKQogICkKCiMgUHJpbnQgdGhlIHJlc3VsdApwcmludChoYXJkc2hpcF9pbmRleF9kaXN0cmlidXRpb24pCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMKVklTVUFMSVpBVElPTiAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiNXb3JsZCBtYXAgCmBgYHtyfQp3b3JsZF9tYXAgPC0gbWFwX2RhdGEoIndvcmxkIikKcmVjb3JkZWRfY291bnRyaWVzIDwtIHVuaXF1ZShXVlNfZGF0YSRjb3VudHJ5KQp3b3JsZF9tYXAkcmVjb3JkZWQgPC0gaWZlbHNlKHdvcmxkX21hcCRyZWdpb24gJWluJSByZWNvcmRlZF9jb3VudHJpZXMsICJSZWNvcmRlZCIsICJOb3QgUmVjb3JkZWQiKQoKZ2dwbG90KHdvcmxkX21hcCwgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gcmVjb3JkZWQpKSArIAogIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWNvcmRlZCIgPSAicmVkIiwgIk5vdCBSZWNvcmRlZCIgPSAibGlnaHRncmV5IiksIGd1aWRlID0gIm5vbmUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBsYWJzKHRpdGxlID0gIldWUyIsIGZpbGwgPSAiU3RhdHVzIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKI2dyYXBoIGFjcm9zcyBjb3VudHJpZXM6IHJpc2sgdGFraW5nIHZzIGFnZSB2cyBnZW5kZXIgKFotc2NvcmUgZm9yIGFnZSBhbmQgcmlzayB0YWtpbmcpICAgCmBgYHtyfQojIFJpc2sgdnMgYWdlIHdpdGggY29sb3ItY29kZWQgZ2VuZGVyIHBlciBDb3VudHJ5CiMgUmlzayB2cyBhZ2Ugd2l0aCBjb2xvci1jb2RlZCBnZW5kZXIgcGVyIENvdW50cnkKIyBTa2FsaWVydW5nIGRlcyBaLVNjb3JlcyBmw7xyIGRhcyBBbHRlciBhbnBhc3NlbgpXVlNfZGF0YSR6X3Njb3JlX2FnZV9zY2FsZWQgPC0gMTUgKiBXVlNfZGF0YSR6X3Njb3JlX2FnZSArIDQyCgoKZ2dwbG90KFdWU19kYXRhLCBhZXMoel9zY29yZV9hZ2Vfc2NhbGVkLCBaX3Njb3JlX3Jpc2t0YWtpbmcsIGNvbG9yID0gYXMuZmFjdG9yKGdlbmRlcikpKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMSwgaGVpZ2h0ID0gMC4xKSwgc2l6ZSA9IDAuMSkgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQyLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArICAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiKSwgbGFiZWxzID0gYygiTWFsZSIsICJGZW1hbGUiKSkgKwogIGxhYnMoY29sb3IgPSAiR2VuZGVyIikgKwogIHhsYWIoIkFnZSIpICsKICB5bGFiKCJSaXNrIFRha2luZyIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMCwgYnkgPSAxNSksIGxpbWl0cyA9IGMoMCwgMTAwKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpXVlNfZGF0YQpgYGAKCiNyZWdyZXNzaW9uIHRhYmxlIChyaXNrIHRha2luZyBhbmQgYWdlIC0+IFotc2NvcmUpCmBgYHtyfQpyZWdyZXNzaW9uX3Jlc3VsdHNfV1ZTIDwtIFdWU19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIGRvKG1vZGVsID0gbG0oWl9zY29yZV9yaXNrdGFraW5nIH4gc2NhbGUoYWdlKSArIGdlbmRlciwgZGF0YSA9IC4pKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudHJ5ID0gZmlyc3QoY291bnRyeSksCiAgICBpbnRlcmNlcHQgPSBjb2VmKHN1bW1hcnkobW9kZWwpKVsxLCAxXSwKICAgIHNsb3BlX2FnZSA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzIsIDFdLAogICAgc2xvcGVfZ2VuZGVyID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMywgMV0KICApCgpyZWdyZXNzaW9uX3Jlc3VsdHNfV1ZTCmBgYAoKI3RhYmxlIGludGVyY2VwdCBhbmQgc2xvcGUgCmBgYHtyfQpyZWdyZXNzaW9uX3Jlc3VsdHNfZ3BzIDwtIGdwc19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIGRvKG1vZGVsID0gbG0ocmlza3Rha2luZyB+IHpfc2NvcmVfYWdlICsgZ2VuZGVyLCBkYXRhID0gLikpICU+JQogIHN1bW1hcml6ZSgKICAgIGNvdW50cnkgPSBmaXJzdChjb3VudHJ5KSwKICAgIGludGVyY2VwdCA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzEsIDFdLAogICAgc2xvcGVfYWdlID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgMV0sCiAgICBzbG9wZV9nZW5kZXIgPSBjb2VmKHN1bW1hcnkobW9kZWwpKVszLCAxXQogICkKCnJlZ3Jlc3Npb25fcmVzdWx0c19ncHMKYGBgCgojIENvdW50cmllcywgdGhhdCBhcmUgaW4gYm90aCBkYXRhc2V0cwpgYGB7cn0KY29tbW9uX2NvdW50cmllcyA8LSBpbnRlcnNlY3QoV1ZTX2RhdGEkY291bnRyeSwgZ3BzX2RhdGEkY291bnRyeSkKY29tbW9uX2NvdW50cmllcwpgYGAKCgojIEZpbHRlcmluZyBTZWxlY3RlZCBDb3VudHJpZXMgZnJvbSBkYXRhc2V0IGdwc19kYXRhIGFuZCBjcmVhdGluZyBhIG5ldyBzZXQKYGBge3J9CiMgQ291bnRyaWVzIHRoYXQgYXJlIGluIGJvdGggZGF0YXNldHMKY29tbW9uX2NvdW50cmllcyA8LSBpbnRlcnNlY3QoV1ZTX2RhdGEkY291bnRyeSwgZ3BzX2RhdGEkY291bnRyeSkKCiMgRmlsdGVyIG9yaWdpbmFsIGRhdGFzZXQgYmFzZWQgb24gY29tbW9uIGNvdW50cmllcwpuZXdfZ3BzIDwtIGdwc19kYXRhW2dwc19kYXRhJGNvdW50cnkgJWluJSBjb21tb25fY291bnRyaWVzLCBdCgojIFZpZXcgdGhlIG5ldyBkYXRhc2V0Cm5ld19ncHMKYGBgCgojIFJlZ3Jlc3Npb24gQW5hbHlzaXMgb2YgUmlzay1UYWtpbmcgQmVoYXZpb3IgaW4gTmV3IFdWUyBEYXRhCmBgYHtyfQpyZWdyZXNzaW9uX3Jlc3VsdHNfV1ZTX25ldyA8LSBuZXdfV1ZTICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIGRvKG1vZGVsID0gbG0oWl9zY29yZV9yaXNrdGFraW5nIH4gc2NhbGUoYWdlKSArIGdlbmRlciwgZGF0YSA9IC4pKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudHJ5ID0gZmlyc3QoY291bnRyeSksCiAgICBpbnRlcmNlcHRfV1ZTID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMSwgMV0sCiAgICBzbG9wZV9hZ2VfV1ZTID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgMV0sCiAgICBzbG9wZV9nZW5kZXJfV1ZTID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMywgMV0KICApCgpyZWdyZXNzaW9uX3Jlc3VsdHNfV1ZTX25ldwpgYGAKCiMgUmVncmVzc2lvbiBBbmFseXNpcyBvZiBSaXNrLVRha2luZyBCZWhhdmlvciBpbiBuZXdfZ3BzIERhdGEKYGBge3J9CnJlZ3Jlc3Npb25fcmVzdWx0c19ncHNfbmV3IDwtIG5ld19ncHMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgZG8obW9kZWwgPSBsbShyaXNrdGFraW5nIH4gc2NhbGUoYWdlKSArIGdlbmRlciwgZGF0YSA9IC4pKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudHJ5ID0gZmlyc3QoY291bnRyeSksCiAgICBpbnRlcmNlcHRfZ3BzID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMSwgMV0sCiAgICBzbG9wZV9hZ2VfZ3BzID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMiwgMV0sCiAgICBzbG9wZV9nZW5kZXJfZ3BzID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMywgMV0KICApCgpyZWdyZXNzaW9uX3Jlc3VsdHNfZ3BzX25ldwpgYGAKCiNNZXJnaW5nIFJlZ3Jlc3Npb24gUmVzdWx0cyB3aXRoIEFkZGl0aW9uYWwgRGF0YSBhbmQgSGFyZHNoaXAgSW5kZXgKYGBge3J9CnJlZ3Jlc3Npb25fcmVzdWx0c19ncHNfbmV3CnJlZ3Jlc3Npb25fcmVzdWx0c19XVlNfbmV3CgojIEFzc3VtaW5nICJjb3VudHJ5IiBpcyB0aGUgY29tbW9uIGNvbHVtbgptZXJnZWRfcmVzdWx0cyA8LSBtZXJnZShyZWdyZXNzaW9uX3Jlc3VsdHNfZ3BzX25ldywgcmVncmVzc2lvbl9yZXN1bHRzX1dWU19uZXcsIGJ5ID0gImNvdW50cnkiLCBhbGwgPSBUUlVFKQoKIyBSZWFkIGRhdGEgZnJvbSB0aGUgRXhjZWwgZmlsZQpuZXdfZGF0YSA8LSByZWFkX2V4Y2VsKCIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvSGFyZHNoaXAvSGFyZHNoaXBfY29tcGxldGVfMjAyNC54bHN4IikKCiMgTm93IHlvdSBjYW4gd29yayB3aXRoIHRoZSAnbmV3X2RhdGEnIG9iamVjdApwcmludChuZXdfZGF0YSkKCiMgUGVyZm9ybSB0aGUgbGVmdF9qb2luIG9wZXJhdGlvbgpuZXdfZGF0YSA8LSBsZWZ0X2pvaW4obWVyZ2VkX3Jlc3VsdHMsIG5ld19kYXRhLCBieSA9ICJjb3VudHJ5IikKCiMgU2VsZWN0IHNwZWNpZmljIGNvbHVtbnMKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBpbnRlcmNlcHRfZ3BzLCBzbG9wZV9hZ2VfZ3BzLCBzbG9wZV9nZW5kZXJfZ3BzLCBpbnRlcmNlcHRfV1ZTLCBzbG9wZV9hZ2VfV1ZTLCBzbG9wZV9nZW5kZXJfV1ZTLCBpc29jb2RlKQoKIyBQcmludCB0aGUgZmluYWwgZGF0YQpwcmludChuZXdfZGF0YSkKCmhhcmRzaGlwX2luZGV4IDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9IYXJkc2hpcC9IYXJkc2hpcF9jb21wbGV0ZV8yMDI0Lnhsc3giKQpwcmludChoYXJkc2hpcF9pbmRleCkKCmhhcmRzaGlwX2RhdGFfY29tcGxldGUgPC0gbGVmdF9qb2luKHJlZ3Jlc3Npb25fcmVzdWx0c19XVlMsIGhhcmRzaGlwX2luZGV4LCBieSA9ICJjb3VudHJ5IikKaGFyZHNoaXBfZGF0YV9jb21wbGV0ZQpgYGAKCgojIGxvZyB0cmFuc2Zvcm0KYGBge3J9CmhhcmRzaGlwX2RhdGFfY29tcGxldGUkbWVhbl9ob21pY2lkZT1sb2coaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRtZWFuX2hvbWljaWRlKQpoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJGdkcD1sb2coaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRnZHApCmhhcmRzaGlwX2RhdGFfY29tcGxldGUkSW5mYW50X21vcnRhbGl0eT1sb2coaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5KQpoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJGxpZmVfZXhwZWN0PWxvZyhoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJGxpZmVfZXhwZWN0KQpoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJGdpbmlfaW5jb21lPWxvZyhoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJGdpbmlfaW5jb21lKQpoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJHByaW1hcnlfZmVtYWxlX2Vucm9sbG1lbnRfcmF0ZT1sb2coaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRwcmltYXJ5X2ZlbWFsZV9lbnJvbGxtZW50X3JhdGUpCgojIGNoYW5naW5nIHZhcmlhYmxlcyBpbnRvIHRoZSBzYW1lIGRpcmVjdGlvbgoKIyBSZXZlcnNlIENvZGllcnVuZwpoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJG1lYW5faG9taWNpZGU9c2NhbGUoaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRtZWFuX2hvbWljaWRlKQpoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJGdkcD1zY2FsZSgtaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRnZHApCmhhcmRzaGlwX2RhdGFfY29tcGxldGUkSW5mYW50X21vcnRhbGl0eT1zY2FsZShoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJEluZmFudF9tb3J0YWxpdHkpCmhhcmRzaGlwX2RhdGFfY29tcGxldGUkbGlmZV9leHBlY3Q9c2NhbGUoLWhhcmRzaGlwX2RhdGFfY29tcGxldGUkbGlmZV9leHBlY3QpCmhhcmRzaGlwX2RhdGFfY29tcGxldGUkZ2luaV9pbmNvbWU9c2NhbGUoaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRnaW5pX2luY29tZSkKaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRwcmltYXJ5X2ZlbWFsZV9lbnJvbGxtZW50X3JhdGU9c2NhbGUoaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRwcmltYXJ5X2ZlbWFsZV9lbnJvbGxtZW50X3JhdGUpCgpoYXJkc2hpcF9kYXRhX2NvbXBsZXRlCmBgYAoKIyBjcmVhdGUgYSBoYXJkc2hpcCBpbmRleApgYGB7cn0KaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRoYXJkc2hpcD0oaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRtZWFuX2hvbWljaWRlK2hhcmRzaGlwX2RhdGFfY29tcGxldGUkZ2RwK2hhcmRzaGlwX2RhdGFfY29tcGxldGUkZ2luaV9pbmNvbWUraGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRsaWZlX2V4cGVjdCtoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJEluZmFudF9tb3J0YWxpdHkraGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRwcmltYXJ5X2ZlbWFsZV9lbnJvbGxtZW50X3JhdGUpLzYKCmhhcmRzaGlwX2RhdGFfY29tcGxldGUKYGBgCgojIENvbXBhcmlzb24gb2YgSW50ZXJjZXB0IFZhbHVlcyBiZXR3ZWVuIEdQUyBhbmQgV1ZTIERhdGEKYGBge3J9CiMgUGxvdHRpbmcgY29tcGFyaW5nIGludGVyZWNlcHRzCmdncGxvdChuZXdfZGF0YSwgYWVzKHggPSBpbnRlcmNlcHRfZ3BzLCB5ID0gaW50ZXJjZXB0X1dWUywgbGFiZWwgPSBpc29jb2RlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDEuNSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBpc29jb2RlKSwgdmp1c3QgPSAtMC41LCBoanVzdCA9IC0wLjUpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpc29uIG9mIEludGVyY2VwdCBWYWx1ZXMiLAogICAgICAgeCA9ICJJbnRlcmNlcHRfZ3BzIiwKICAgICAgIHkgPSAiSW50ZXJjZXB0X1dWUyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHhsaW0oYygwLCAxLjIpKSArCiAgeWxpbShjKDAsIDEuMikpICsKICBjb29yZF9maXhlZCgpCgojIEFzc3VtaW5nIHlvdSBoYXZlIGEgZGF0YSBmcmFtZSBuYW1lZCAnbmV3X2RhdGEnIHdpdGggY29sdW1ucyAnaW50ZXJjZXB0X2dwcycsICdpbnRlcmNlcHRfV1ZTJywgYW5kICdpc29jb2RlJwoKZ2dwbG90KG5ld19kYXRhLCBhZXMoeCA9IGludGVyY2VwdF9ncHMsIHkgPSBpbnRlcmNlcHRfV1ZTLCBsYWJlbCA9IGlzb2NvZGUpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fdGV4dF9yZXBlbCgKICAgIGFlcyhsYWJlbCA9IGlzb2NvZGUpLAogICAgYm94LnBhZGRpbmcgPSAwLjUsCiAgICBwb2ludC5wYWRkaW5nID0gMC4xLAogICAgZm9yY2UgPSA1CiAgKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnMoeCA9ICJJbnRlcmNlcHQgR2xvYmFsIFByZWZlcmVuY2UgU3R1ZHkiLAogICAgICAgeSA9ICJJbnRlcmNlcHQgV29ybGQgVmFsdWUgU3VydmV5IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgeGxpbShjKDAsIDEuMDcpKSArCiAgeWxpbShjKDAsIDEuMDcpKSArCiAgY29vcmRfZml4ZWQoKQoKIyBBbm5vdGF0ZSB3aXRoIHdvcmQgY2xvdWQKd29yZGNsb3VkKHdvcmRzID0gbmV3X2RhdGEkaXNvY29kZSwgZnJlcSA9IHJlcCgxLCBucm93KG5ld19kYXRhKSksIHNjYWxlID0gYygyLCAwLjUpKQoKIyBBbm5vdGF0ZSB3aXRoIHdvcmQgY2xvdWQKd29yZGNsb3VkKHdvcmRzID0gbmV3X2RhdGEkaXNvY29kZSwgZnJlcSA9IHJlcCgxLCBucm93KG5ld19kYXRhKSksIHNjYWxlID0gYygyLCAwLjUpKQoKIyBBc3N1bWluZyBtZXJnZWRfcmVzdWx0cyBoYXMgY29sdW1ucyBpbnRlcmNlcHRfZ3BzIGFuZCBpbnRlcmNlcHRfV1ZTCm1vZGVsIDwtIGxtKGludGVyY2VwdF9XVlMgfiBpbnRlcmNlcHRfZ3BzLCBkYXRhID0gbWVyZ2VkX3Jlc3VsdHMpCgojIFZpZXcgdGhlIHN1bW1hcnkgb2YgdGhlIHJlZ3Jlc3Npb24gbW9kZWwKc3VtbWFyeShtb2RlbCkKCiMgQ2FsY3VsYXRlIHRoZSBjb3JyZWxhdGlvbgpjb3JyZWxhdGlvbiA8LSBjb3IobWVyZ2VkX3Jlc3VsdHMkaW50ZXJjZXB0X2dwcywgbWVyZ2VkX3Jlc3VsdHMkaW50ZXJjZXB0X1dWUykKCiMgUHJpbnQgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50CnByaW50KGNvcnJlbGF0aW9uKQpgYGAKCiNDb21wYXJpc29uIG9mIHRoZSBFZmZlY3Qgb2YgQWdlIG9uIFJpc2sgVGFraW5nIGJldHdlZW4gR1BTIGFuZCBXVlMgRGF0YQpgYGB7cn0KIyBQbG90dGluZyB1c2luZyBnZ3Bsb3QyCmdncGxvdChuZXdfZGF0YSwgYWVzKHggPSBzbG9wZV9hZ2VfZ3BzLCB5ID0gc2xvcGVfYWdlX1dWUywgbGFiZWwgPSBpc29jb2RlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3RleHRfcmVwZWwoCiAgICBhZXMobGFiZWwgPSBpc29jb2RlKSwKICAgIGJveC5wYWRkaW5nID0gMC41LAogICAgcG9pbnQucGFkZGluZyA9IDAuMSwKICAgIGZvcmNlID0gNQogICkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHggPSAiRWZmZWN0IG9mIEFnZSBvbiBSaXNrIFRha2luZyBHbG9iYWwgUHJlZmVyZW5jZSBTdHVkeSIsCiAgICAgICB5ID0gIkVmZmVjdCBvZiBBZ2Ugb24gUmlzayBUYWtpbmcgV29ybGQgVmFsdWUgU3VydmV5IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgeGxpbSgtMC41LCAwKSArCiAgeWxpbShjKC0wLjUsIDApKSArCiAgY29vcmRfZml4ZWQoKQoKbmV3X2RhdGEKCmNvcnJlbGF0aW9uIDwtIGNvcihuZXdfZGF0YSRzbG9wZV9hZ2VfZ3BzLCBuZXdfZGF0YSRzbG9wZV9hZ2VfV1ZTKQoKIyBQcmludCB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQKcHJpbnQoY29ycmVsYXRpb24pCmBgYAoKCiNDb21wYXJpc29uIG9mIHRoZSBFZmZlY3Qgb2YgR2VuZGVyIG9uIFJpc2sgVGFraW5nIGJldHdlZW4gR1BTIGFuZCBXVlMgRGF0YQpgYGB7cn0KIyBQbG90dGluZyB1c2luZyBnZ3Bsb3QyCmdncGxvdChuZXdfZGF0YSwgYWVzKHggPSBzbG9wZV9nZW5kZXJfZ3BzLCB5ID0gc2xvcGVfZ2VuZGVyX1dWUywgbGFiZWwgPSBpc29jb2RlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3RleHRfcmVwZWwoCiAgICBhZXMobGFiZWwgPSBpc29jb2RlKSwKICAgIGJveC5wYWRkaW5nID0gMC41LAogICAgcG9pbnQucGFkZGluZyA9IDAuMSwKICAgIGZvcmNlID0gNQogICkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHggPSAiRWZmZWN0IG9mIEdlbmRlciBvbiBSaXNrIFRha2luZyBHbG9iYWwgUHJlZmVyZW5jZSBTdHVkeSIsCiAgICAgICB5ID0gIkVmZmVjdCBvZiBHZW5kZXIgb24gUmlzayBUYWtpbmcgV29ybGQgVmFsdWUgU3VydmV5IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgeGxpbSgtMC42LCAwLjEyKSArCiAgeWxpbShjKC0wLjYsIDAuMTIpKSArCiAgY29vcmRfZml4ZWQoKQoKbmV3X2RhdGEKCmNvcnJlbGF0aW9uIDwtIGNvcihuZXdfZGF0YSRzbG9wZV9nZW5kZXJfZ3BzLCBuZXdfZGF0YSRzbG9wZV9nZW5kZXJfV1ZTKQoKIyBQcmludCB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQKcHJpbnQoY29ycmVsYXRpb24pCmBgYAoKI0NhbGN1bGF0aW9uIG9mIEhhcmRzaGlwIEluZGV4IGZvciBXVlMgRGF0YQpgYGB7cn0KI2hhcmRzaGlwIGZvciBXVlMKaGFyZHNoaXBfdmFsdWVzIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9IYXJkc2hpcC9oYXJkc2hpcF9jb21wbGV0ZV8yMDI0Lnhsc3giKSAKCmxhYmVscyA8LSBjKCJjb3VudHJ5IiwgIm1lYW5faG9taWNpZGUiLCAiZ2RwIiwgImdpbmlfaW5jb21lIiwgIkluZmFudF9tb3J0YWxpdHkiLCAibGlmZV9leHBlY3QiLCAiaXNvY29kZSIsICJwcmltYXJ5X2ZlbWFsZV9lbnJvbGxtZW50X3JhdGUiKQoKcHJpbnQoaGFyZHNoaXBfdmFsdWVzKQoKIyBSZXBsYWNlIHRoZSBjb2x1bW4gbmFtZXMgYXMgcGVyIHlvdXIgYWN0dWFsIGNvbHVtbiBuYW1lcwojIFotc3RhbmRhcmRpemUgc3BlY2lmaWMgY29sdW1ucwpoYXJkc2hpcF92YWx1ZXMkZ2RwIDwtIHNjYWxlKGhhcmRzaGlwX3ZhbHVlcyRnZHApCmhhcmRzaGlwX3ZhbHVlcyRnaW5pX2luY29tZSA8LSBzY2FsZShoYXJkc2hpcF92YWx1ZXMkZ2luaV9pbmNvbWUpCmhhcmRzaGlwX3ZhbHVlcyRJbmZhbnRfbW9ydGFsaXR5IDwtIHNjYWxlKGhhcmRzaGlwX3ZhbHVlcyRJbmZhbnRfbW9ydGFsaXR5KQpoYXJkc2hpcF92YWx1ZXMkbGlmZV9leHBlY3QgPC0gc2NhbGUoaGFyZHNoaXBfdmFsdWVzJGxpZmVfZXhwZWN0KQpoYXJkc2hpcF92YWx1ZXMkbWVhbl9ob21pY2lkZSA8LSBzY2FsZShoYXJkc2hpcF92YWx1ZXMkbWVhbl9ob21pY2lkZSkKaGFyZHNoaXBfdmFsdWVzJHByaW1hcnlfZmVtYWxlX2Vucm9sbG1lbnRfcmF0ZSA8LSBzY2FsZShoYXJkc2hpcF92YWx1ZXMkcHJpbWFyeV9mZW1hbGVfZW5yb2xsbWVudF9yYXRlKQoKaGFyZHNoaXBfdmFsdWVzCgpoYXJkc2hpcF92YWx1ZXMgPC0gaGFyZHNoaXBfdmFsdWVzJT4lCiAgbXV0YXRlKGhhcmRzaGlwID0gKG1lYW5faG9taWNpZGUgKyBnZHAgKyBJbmZhbnRfbW9ydGFsaXR5ICsgbGlmZV9leHBlY3QgKyBnaW5pX2luY29tZSArIHByaW1hcnlfZmVtYWxlX2Vucm9sbG1lbnRfcmF0ZSkgLyA2KQpoYXJkc2hpcF92YWx1ZXMKaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSA8LSBsZWZ0X2pvaW4ocmVncmVzc2lvbl9yZXN1bHRzX1dWUywgaGFyZHNoaXBfdmFsdWVzLCBieSA9ICJjb3VudHJ5IikKaGFyZHNoaXBfZGF0YV9jb21wbGV0ZQpgYGAKCiNSZWxhdGlvbnNoaXAgYmV0d2VlbiBIYXJkc2hpcCBhbmQgUmlzayBUYWtpbmcgZm9yIFdWUyBEYXRhCmBgYHtyfQojRm9yIFdWUwpnZ3Bsb3QoaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSwgYWVzKHggPSBoYXJkc2hpcCwgeSA9IGludGVyY2VwdCwgbGFiZWwgPSBpc29jb2RlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3RleHRfcmVwZWwoCiAgICBhZXMobGFiZWwgPSBpc29jb2RlKSwKICAgIGJveC5wYWRkaW5nID0gMC41LAogICAgcG9pbnQucGFkZGluZyA9IDAuMSwKICAgIGZvcmNlID0gNQogICkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHggPSAiSGFyZHNoaXAiLAogICAgICAgeSA9ICJSaXNrIFRha2luZyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHhsaW0oLTIsIDIpICsKICB5bGltKC0wLjYsIDEpICsKICBjb29yZF9maXhlZChyYXRpbyA9IDIuNSkKYGBgCgojIEFzc29jaWF0aW9uIGJldHdlZW4gSGFyZHNoaXAgYW5kIEFnZSBFZmZlY3Qgb24gUmlzayBUYWtpbmcgZm9yIFdWUyBEYXRhCmBgYHtyfQojRm9yIFdWUwpnZ3Bsb3QoaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSwgYWVzKHggPSBoYXJkc2hpcCwgeSA9IHNsb3BlX2FnZSwgbGFiZWwgPSBpc29jb2RlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3RleHRfcmVwZWwoCiAgICBhZXMobGFiZWwgPSBpc29jb2RlKSwKICAgIGJveC5wYWRkaW5nID0gMC41LAogICAgcG9pbnQucGFkZGluZyA9IDAuMSwKICAgIGZvcmNlID0gNQogICkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHggPSAiSGFyZHNoaXAiLAogICAgICAgeSA9ICJBZ2UgRWZmZWN0IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgIHhsaW0oLTIsIDIpICsKICBjb29yZF9maXhlZChyYXRpbyA9IDgpCmBgYAoKIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiBIYXJkc2hpcCBhbmQgUmlzayBUYWtpbmcgd2l0aCBSZWdyZXNzaW9uIExpbmUKYGBge3J9CmdncGxvdChoYXJkc2hpcF9kYXRhX2NvbXBsZXRlLCBhZXMoeCA9IGhhcmRzaGlwLCB5ID0gaW50ZXJjZXB0LCBsYWJlbCA9IGlzb2NvZGUpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fdGV4dF9yZXBlbCgKICAgIGFlcyhsYWJlbCA9IGlzb2NvZGUpLAogICAgYm94LnBhZGRpbmcgPSAwLjUsCiAgICBwb2ludC5wYWRkaW5nID0gMC4xLAogICAgZm9yY2UgPSA1CiAgKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnMoeCA9ICJIYXJkc2hpcCIsCiAgICAgICB5ID0gIlJpc2sgVGFraW5nIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgY29vcmRfZml4ZWQoKQpgYGAKCiMgTGluZWFyIE1vZGVsIFN1bW1hcnk6IEhhcmRzaGlwIGFuZCBSaXNrIFRha2luZyBSZWxhdGlvbnNoaXAKYGBge3J9CiMgTGluZWFyZXMgTW9kZWxsIGbDvHIgZGVuIGVyc3RlbiBGYWxsCm1vZGVsX2ludGVyY2VwdCA8LSBsbShoYXJkc2hpcCB+IGludGVyY2VwdCwgZGF0YSA9IGhhcmRzaGlwX2RhdGFfY29tcGxldGUpCnN1bW1hcnlfaW50ZXJjZXB0IDwtIHN1bW1hcnkobW9kZWxfaW50ZXJjZXB0KQpwcmludChzdW1tYXJ5X2ludGVyY2VwdCkKCiMgQ29ycmVsYXRpb24gSGFyZHNoaXAgdW5kIFJpc2sgVGFraW5nCmNvcnJlbGF0aW9uIDwtIGNvcihoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJGhhcmRzaGlwLCBoYXJkc2hpcF9kYXRhX2NvbXBsZXRlJGludGVyY2VwdCkKCnByaW50KHBhc3RlKCJDb3JyZWxhdGlvbiBIYXJkc2hpcCB1bmQgUmlzayBUYWtpbmc6IiwgY29ycmVsYXRpb24pKQpgYGAKCiMgTGluZWFyIE1vZGVsIFN1bW1hcnk6IFJlbGF0aW9uc2hpcCBCZXR3ZWVuIEhhcmRzaGlwIGFuZCBBZ2UgRWZmZWN0IG9uIFJpc2sgVGFraW5nCmBgYHtyfQojIExpbmVhcmVzIE1vZGVsbCBmw7xyIGRlbiBlcnN0ZW4gRmFsbAptb2RlbF9pbnRlcmNlcHQgPC0gbG0oaGFyZHNoaXAgfiBzbG9wZV9hZ2UsIGRhdGEgPSBoYXJkc2hpcF9kYXRhX2NvbXBsZXRlKQpzdW1tYXJ5X2ludGVyY2VwdCA8LSBzdW1tYXJ5KG1vZGVsX2ludGVyY2VwdCkKcHJpbnQoc3VtbWFyeV9pbnRlcmNlcHQpCgojIENvcnJlbGF0aW9uIEhhcmRzaGlwIHVuZCBSaXNrIFRha2luZwpjb3JyZWxhdGlvbiA8LSBjb3IoaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRoYXJkc2hpcCwgaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRzbG9wZV9hZ2UpCgpwcmludChwYXN0ZSgiQ29ycmVsYXRpb24gSGFyZHNoaXAgdW5kIFJpc2sgVGFraW5nOiIsIGNvcnJlbGF0aW9uKSkKYGBgCiMgTGluZWFyIE1vZGVsIFN1bW1hcnk6IFJlbGF0aW9uc2hpcCBCZXR3ZWVuIEhhcmRzaGlwIGFuZCBHZW5kZXIgRWZmZWN0IG9uIFJpc2sgVGFraW5nCmBgYHtyfQojIExpbmVhcmVzIE1vZGVsbCBmw7xyIGRlbiBlcnN0ZW4gRmFsbAptb2RlbF9pbnRlcmNlcHQgPC0gbG0oaGFyZHNoaXAgfiBzbG9wZV9nZW5kZXIsIGRhdGEgPSBoYXJkc2hpcF9kYXRhX2NvbXBsZXRlKQpzdW1tYXJ5X2ludGVyY2VwdCA8LSBzdW1tYXJ5KG1vZGVsX2ludGVyY2VwdCkKcHJpbnQoc3VtbWFyeV9pbnRlcmNlcHQpCgojIENvcnJlbGF0aW9uIEhhcmRzaGlwIHVuZCBSaXNrIFRha2luZwpjb3JyZWxhdGlvbiA8LSBjb3IoaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRoYXJkc2hpcCwgaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSRzbG9wZV9nZW5kZXIpCgpwcmludChwYXN0ZSgiQ29ycmVsYXRpb24gSGFyZHNoaXAgdW5kIFJpc2sgVGFraW5nOiIsIGNvcnJlbGF0aW9uKSkKYGBgCgojIEFuYWx5c2lzIG9mIFJpc2sgVGFraW5nIHZzLiBBZ2Ugd2l0aCBHZW5kZXIgRmFjdG9yIGluIFdWUyBEYXRhCmBgYHtyfQpXVlNfZGF0YQojIExpbmVhcmVzIE1vZGVsbCBmw7xyIFJpc2sgVGFraW5nIHZzLiBBZ2UKbW9kZWxfcmlza19hZ2UgPC0gbG0oWl9zY29yZV9yaXNrdGFraW5nIH4gel9zY29yZV9hZ2UgKyBmYWN0b3IoZ2VuZGVyKSwgZGF0YSA9IFdWU19kYXRhKQpzdW1tYXJ5X3Jpc2tfYWdlIDwtIHN1bW1hcnkobW9kZWxfcmlza19hZ2UpCnByaW50KHN1bW1hcnlfcmlza19hZ2UpCgpjb3JyZWxhdGlvbiA8LSBieShXVlNfZGF0YSwgV1ZTX2RhdGEkZ2VuZGVyLCBmdW5jdGlvbih4KSBjb3IoeCR6X3Njb3JlX2FnZSwgeCRaX3Njb3JlX3Jpc2t0YWtpbmcpKQoKcHJpbnQocGFzdGUoIkNvcnJlbGF0aW9uIEhhcmRzaGlwIHVuZCBSaXNrIFRha2luZzoiLCBjb3JyZWxhdGlvbikpCmBgYAoKIyBzaG93IG5ld19kYXRhCmBgYHtyfQpuZXdfZGF0YQpgYGAKCiMgQ29tcGFyaXNvbiBvZiBHZW5kZXIgRWZmZWN0cyBvbiBSaXNrIFRha2luZyBCZXR3ZWVuIEdsb2JhbCBQcmVmZXJlbmNlIFN0dWR5IGFuZCBXb3JsZCBWYWx1ZSBTdXJ2ZXkgRGF0YQpgYGB7cn0KIyBMaW5lYXJlcyBNb2RlbGwgZsO8ciBSaXNrIFRha2luZyB2cy4gQWdlCm1vZGVsIDwtIGxtKHNsb3BlX2dlbmRlcl9ncHMgfiBzbG9wZV9nZW5kZXJfV1ZTLCBkYXRhID0gbmV3X2RhdGEpCnN1bW1hcnlfbW9kZWwgPC0gc3VtbWFyeShtb2RlbCkKcHJpbnQoc3VtbWFyeV9tb2RlbCkKCmNvcnJlbGF0aW9uIDwtIGNvcihuZXdfZGF0YSRzbG9wZV9hZ2VfZ3BzLCBuZXdfZGF0YSRzbG9wZV9hZ2VfV1ZTKQpwcmludChwYXN0ZSgiQ29ycmVsYXRpb24gSGFyZHNoaXAgdW5kIFJpc2sgVGFraW5nOiIsIGNvcnJlbGF0aW9uKSkKYGBgCgojIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIEhhcmRzaGlwIGFuZCBHZW5kZXIgRWZmZWN0IG9uIFJpc2sgVGFraW5nCmBgYHtyfQpnZ3Bsb3QoaGFyZHNoaXBfZGF0YV9jb21wbGV0ZSwgYWVzKHggPSBoYXJkc2hpcCwgeSA9IHNsb3BlX2dlbmRlciwgbGFiZWwgPSBpc29jb2RlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3RleHRfcmVwZWwoCiAgICBhZXMobGFiZWwgPSBpc29jb2RlKSwKICAgIGJveC5wYWRkaW5nID0gMC41LAogICAgcG9pbnQucGFkZGluZyA9IDAuMSwKICAgIGZvcmNlID0gNQogICkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHggPSAiSGFyZHNoaXAiLAogICAgICAgeSA9ICJHZW5kZXIgRWZmZWN0IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgIHhsaW0oLTIsIDIpICsKICBjb29yZF9maXhlZChyYXRpbyA9IDYpCmBgYAoKCgo=